home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / C / Applications / MacGzip 1.1.1 / Mac / MacBinary.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-01  |  7.1 KB  |  220 lines  |  [TEXT/KAHL]

  1. /*
  2.  * MacBinary II+ stuff
  3.  * From Peter N. Lewis (MacBinary II+ 1.0.0 crc.a)
  4.  */
  5.  
  6. #include "Macbinary.h"
  7. #define    PStrCpy(a,b)        BlockMove((b), (a), *(b) + 1 )
  8.  
  9. static short CalcMBCRC( unsigned long count, char *buffer);
  10.  
  11.  
  12. OSErr SetCatInfoFromMBHeader( FSSpec *myFSSpec, MBIIStartHeader *start, MBIIHeader *header)
  13. {
  14.     OSErr                error = noErr;
  15.     CInfoPBRec            myParamBlock;
  16.     
  17.     myParamBlock.hFileInfo.ioNamePtr                = myFSSpec->name;
  18.     myParamBlock.hFileInfo.ioVRefNum                 = myFSSpec->vRefNum;
  19.     myParamBlock.hFileInfo.ioFDirIndex                = 0;
  20.     myParamBlock.hFileInfo.ioDirID                    = myFSSpec->parID;
  21.     
  22.     if ( noErr == (error = PBGetCatInfo( (CInfoPBPtr) &myParamBlock, false )))
  23.     {
  24.         myParamBlock.hFileInfo.ioNamePtr                = myFSSpec->name;
  25.         myParamBlock.hFileInfo.ioVRefNum                 = myFSSpec->vRefNum;
  26.         myParamBlock.hFileInfo.ioFDirIndex                = 0;
  27.         myParamBlock.hFileInfo.ioDirID                    = myFSSpec->parID;
  28.         myParamBlock.hFileInfo.ioFlFndrInfo.fdType        = start->ftype;
  29.         myParamBlock.hFileInfo.ioFlFndrInfo.fdCreator    = start->fcreator;
  30.         myParamBlock.hFileInfo.ioFlFndrInfo.fdFlags     =
  31.                 ((start->flags_high << 8) & 0xFF00) | (start->flags_low & 0x00FF);
  32.                 
  33.         myParamBlock.hFileInfo.ioFlFndrInfo.fdFlags        &= !(fInvisible );
  34.         
  35.         myParamBlock.hFileInfo.ioFlFndrInfo.fdLocation    = start->flocation;
  36.         myParamBlock.hFileInfo.ioFlCrDat                = start->create_date;
  37.         myParamBlock.hFileInfo.ioFlMdDat                = start->mod_date;
  38.     
  39.         error = PBSetCatInfo(& myParamBlock, false);
  40.     }
  41.     return error;
  42. }
  43.  
  44. OSErr MBHeaderFromFSSpec( FSSpec *myFSSpec, MBIIStartHeader *start, MBIIHeader *header)
  45. {
  46.     OSErr                error = noErr;
  47.     CInfoPBRec            myParamBlock;
  48.     FInfo                *myFInfo = & (myParamBlock.hFileInfo.ioFlFndrInfo);
  49.     
  50.     myParamBlock.hFileInfo.ioNamePtr =        myFSSpec->name;
  51.     myParamBlock.hFileInfo.ioVRefNum =        myFSSpec->vRefNum;
  52.     myParamBlock.hFileInfo.ioDirID =        myFSSpec->parID;
  53.     myParamBlock.hFileInfo.ioFDirIndex =    0;
  54.  
  55.     if ( noErr == (error = PBGetCatInfo( (CInfoPBPtr) &myParamBlock, false )))
  56.     {
  57.  
  58. /*        memset((char*)start,0x00,sizeof(*start)); *//* just cosmetic */
  59. /*        memset((char*)header,0x00,sizeof(*header)); *//* just cosmetic */
  60.  
  61.         PStrCpy( start->name,  myFSSpec->name);
  62.         start->ftype            = myFInfo->fdType;
  63.         start->fcreator            = myFInfo->fdCreator;
  64.         start->flags_high        = ( myFInfo->fdFlags >> 8 );
  65.         start->flags_low        = myFInfo->fdFlags;
  66.         start->zero1            = 0;
  67.         start->flocation        = myFInfo->fdLocation;
  68.         start->windowID            = myFInfo->fdFldr;
  69.         start->protected        = 0;
  70.         start->zero2            = 0;
  71.         start->dlen                = myParamBlock.hFileInfo.ioFlLgLen;
  72.         start->rlen                = myParamBlock.hFileInfo.ioFlRLgLen;
  73.         start->create_date        = myParamBlock.hFileInfo.ioFlCrDat;
  74.         start->mod_date            = myParamBlock.hFileInfo.ioFlMdDat;
  75.         start->clen                = 0;
  76.         
  77.         header->version                = 0;
  78.         BlockMove( start, &(header->MBIIStart), sizeof(*start));
  79.         header->total_unpack_len    = 0L;
  80.         header->second_header_len    = 0L;
  81.         header->versionII            = 129;
  82.         header->minversionII        = 129;
  83.         header->crc                    = CalcMBCRC( 124, (char *) header);
  84.         header->processorID            = 0;
  85.     }
  86.     return error;    
  87. }
  88.  
  89. /*
  90.  * From MacBinary II Conference 6/21/87:
  91.  * To determine if a header is a valid  MacBinary header, check bytes 0 and 74 to
  92.  * be both zero.  If they are both zero, either (a) the CRC should match, which
  93.  * means it is a MB II file, or (b) byte 82 is zero, which means it may be a MB I
  94.  * file.  (Note that, at the current version level, byte 82 is kept zero to
  95.  * maintain compatibility with MacBinary I. If at some point the MacBinary
  96.  * versions change sufficiently that it is necessary to keep MacBinary I programs
  97.  * from downloading these files, we can change byte 82 to non-zero.)
  98.  *
  99.  *
  100.  * SPDsoft 97. But...
  101.  * What when all the bytes are 0x00 ????
  102.  * The CRC gives 0 too, so this method would return "valid MB II file" !
  103.  *
  104.  * By now I will add only a (*start->name != 0x00) condition
  105.  *
  106.  */
  107.  
  108. short ValidateMBHeader( MBIIStartHeader *start, MBIIHeader *header, Boolean handle2plus )
  109. {
  110.     short packet_type = PT_None;
  111.     
  112.     BlockMove(&(header->MBIIStart), start, sizeof(*start));
  113.     
  114.     if ((header->version <= handle2plus) && (*((char*)header + 74 ) == 0x00 ))
  115.     {
  116.         if (
  117.             (header->crc == CalcMBCRC( 124, (char *) header) ) &&
  118.             (*start->name != 0x00 )
  119.             )
  120.         {
  121.             if (
  122.                     (header->version == 1) &&
  123.                     (start->ftype == macbin_folder_ftype) &&
  124.                     (
  125.                         (start->fcreator == macbin_folder_creator_start) ||
  126.                         (start->fcreator == macbin_folder_creator_end)
  127.                     )
  128.                 )
  129.             {
  130.                 packet_type = (start->fcreator == macbin_folder_creator_start) ? PT_StartBlock : PT_EndBlock;
  131.             }
  132.             else
  133.             {
  134.                 packet_type = PT_File;
  135.             }
  136.         }
  137.         else /* MacBinary I */
  138.         {
  139.             if (
  140.                     (header->version == 0) &&
  141.                     (*((char*)header + 1 ) >= 1 ) &&
  142.                     (*((char*)header + 1 ) <= 31 )
  143.                 )
  144.             {
  145.                     *((char*)header + 101 )        = 0x00 ; /* Zero out the flags low_byte */
  146.                     header->total_unpack_len    = 0;
  147.                     header->second_header_len    = 0;
  148.                     header->versionII            = 129;
  149.                     header->minversionII        = 129;
  150.                     header->crc                    = 0;
  151.                     header->processorID            = 0;
  152.             }
  153.         }
  154.     }
  155.     return packet_type;
  156. }
  157.  
  158.  
  159.  
  160.  
  161.  
  162.  
  163.  
  164. static short CalcMBCRC( unsigned long count, char *buffer)
  165. {
  166.     register unsigned long    i;
  167.     register short            crc;
  168.     register char            *c;
  169.     
  170.     extern unsigned short    crc_16_tab[];
  171.     
  172.     for( i=0, crc=0, c = buffer; i< count; i++)
  173.     {
  174.         crc =     (( crc & 0x00ff )  << 8)
  175.                 ^
  176.                 crc_16_tab [
  177.                             (( crc & 0xff00 ) >> 8)
  178.                             ^
  179.                             ( (short) c[i] & 0x00ff )
  180.                             ];
  181.     }
  182.     return crc;
  183. }
  184.  
  185.  
  186. unsigned short crc_16_tab[] = {
  187.         0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
  188.         0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,
  189.         0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6,
  190.         0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de,
  191.         0x2462,0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485,
  192.         0xa56a,0xb54b,0x8528,0x9509,0xe5ee,0xf5cf,0xc5ac,0xd58d,
  193.         0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,0x46b4,
  194.         0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc,
  195.         0x48c4,0x58e5,0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823,
  196.         0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,0x9969,0xa90a,0xb92b,
  197.         0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12,
  198.         0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a,
  199.         0x6ca6,0x7c87,0x4ce4,0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41,
  200.         0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,0x8d68,0x9d49,
  201.         0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70,
  202.         0xff9f,0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78,
  203.         0x9188,0x81a9,0xb1ca,0xa1eb,0xd10c,0xc12d,0xf14e,0xe16f,
  204.         0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046,0x6067,
  205.         0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e,
  206.         0x02b1,0x1290,0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256,
  207.         0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,0xe54f,0xd52c,0xc50d,
  208.         0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405,
  209.         0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c,
  210.         0x26d3,0x36f2,0x0691,0x16b0,0x6657,0x7676,0x4615,0x5634,
  211.         0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,0xb98a,0xa9ab,
  212.         0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3,
  213.         0xcb7d,0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a,
  214.         0x4a75,0x5a54,0x6a37,0x7a16,0x0af1,0x1ad0,0x2ab3,0x3a92,
  215.         0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,0x8dc9,
  216.         0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1,
  217.         0xef1f,0xff3e,0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8,
  218.         0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0x0ed1,0x1ef0
  219.     };
  220.